package utils

import (
	"math"
	"strconv"
)

// 只向外暴露了Mm
var Mm = new(myMath)

type myMath struct{}

func (c *myMath) MaxInt(a int, b int) int {
	if a > b {
		return a
	}
	return b
}

func (c *myMath) MaxFloat(a float64, b float64) float64 {
	if a > b {
		return a
	}
	return b
}

type AllInt interface {
	int | int8 | int16 | int32 | int64
}

// 多个只能这么写，一个才能像ts的type一样
type AllFloat interface {
	float32 | float64
}

// 使用泛型
func MaxAny[T AllInt | AllFloat](a, b T) T {
	if a > b {
		return a
	}

	return b
}

func MinAny[T AllInt | AllFloat](a, b T) T {
	if a < b {
		return a
	}
	return b
}

func Get[T any]() T {
	var t T
	var ti any = &t
	switch v := ti.(type) {
	case *int:
		*v = 18
	}

	return t
}

// 对float64四舍五入保留n位小数
func RoundFloat64(f float64, n int) float64 {
	return float64(RoundInt(f*math.Pow10(n))) / math.Pow10(n)
}

func RoundInt(f float64) float64 {
	return math.Trunc(f + 0.5)
}

func Float64ToFixedStr(f float64, n int) string {
	return strconv.FormatFloat(f, 'f', n, 64)
}

// 在切片的首个位置添加元素
func Prepend(slice []string, str string) []string {
	slice = append(slice, str)
	copy(slice[1:], slice)
	slice[0] = str
	return slice
}

// float64保留位小数
func Float64ToStr(f float64) string {
	return strconv.FormatFloat(f, 'f', -1, 64)
}
